[ Kotlin 요약 ] 1. Kotlin 기초 문법 (변수, 함수, 컬렉션, 조건, 반복)

[ Kotlin 요약 ] 1. Kotlin 기초 문법 (변수, 함수, 컬렉션, 조건, 반복)

Lecture
Language
태그
language
Kotlin
public
완성
생성일
Jul 15, 2024 04:33 AM
LectureName
Kotlin
😗 실습 사이트
 
 
 

1. 변수


1. 선언

다음과 같이 변경 가능한 변수는 var 변경 불가능한 변수는 val로 선언합니다.
//val 변수명: 타입=값 => 초기값이 할당되면 바꿀 수 없는 변수 val number1: Int = 1 //var 변수명: 타입=값 => 초기값 var number2: Int = 2
 
코틀린의 모든 타입은 객체임으로 변수에 null을 대입할 수 있습니다. 대신 선언할 때 null을 대입할 수 있는 변수인지, null을 대입할 수 없는 변수인지 ?로 구분하여 명확하게 선언하여야 합니다
// null 허용 val v1: Int? = null // null 불허 val v2: Int = null // 에러 val v3: Int = 10 // 정상
 
 
 
초기화를 해야 하는 변수 vs 하지 않아도 되는 변수
🔎 해야 하는 변수
  • 최상위에 선언한 변수(전역 변수)
  • 클래스의 멤버 변수
// 코드 최상위 val topVal: Int = 10 class User { // 클래스 멤버 변수 (java와 동일) val age: Int = 10 }
  • 생성자를 통해 선언 시 바로 초기화가 된다면 반드시 값을 명시할 필요는 없습니다.
 
 
🔎 하지 않아도 되는 변수
  • 함수 내부에 선언한 변수
  • 초기화를 미룬 변수
 
💡
초기화를 미룬 변수?
🤪 lateinit
lateinit으로 선언한 변수는 초기 값을 할당하지 않아도 됩니다. 다만!
  • var 키워드로 선언한 변수이거나
  • int, Long, Short, Double, Float, Boolean, Byte 타입에는 사용할 수 없습니다.
 
🤪 lazy
변수 뒤에 붙는 접미사로 변수 선언 뒤에 by lazy { 내용 } 형식으로 선언되며 변수가 최초로 이용되는 순간 중괄호로 묶은 부분이 자동으로 실행되어 그 결괏값이 변수의 초기값으로 할당됩니다.
 
 
초기화를 하지 않아도 되는 것들에 대한 예시입니다.
function ff() { // 함수 내에 있는 변수 : 초기화 안해도 됨 var inFunc: Int } // lateinit ( 초기화를 나중에 ) lateinit var abcd: String fun main() { abcd = "abcd" println("haha is hahaha $abcd") } // by lazy { 내용 } ( 최초로 변수가 이용 시 내용에 의해서 트리거 ) val llaazzyy: Int by lazy { println("결국 마지막 줄의 실행 결과로 초기화 됩니다.") 10 } fun main() { println("haha is hahaha $llaazzyy") //결과 : "결국 마지막 줄로 초기화 됩니다. haha is hahaha 10" }
 
 
 
 

1.2 변수 타입

코틀린의 모든 변수는 객체 입니다. 이는 즉 변수에 메서드가 존재하며, Int 타입의 변수에 null을 대입할 수도 있습니다. (?를 붙인 경우)
var num1: Int = 123 var num2: Int? = null // 객체의 메서드 이용 var wow = num1.plus(10) // wow = 133
 
 
기초 타입 객체
기초 데이터형을 의미하며, 정수를 표현하는 Int, Short, Long , 실수를 표현하는 Double, Float , 이진수를 표현하는 Byte , 참/거짓을 표현하는 Boolean 타입이 존재합니다.
 
😎 타입 선언은 다음과 같습니다.
// 정수 val t1: Int = 123 val t2: Short = 123 val t3: Long = 10L // 실수 val t4: Float = 10.0f val t5: Double = 10.0 // 이진수 val t6: Byte = 0b10001 // 참, 거짓 val t7: Boolean = true
 
 
 
문자와 문자열
Char은 문자를 표현하는 타입이며 ' 를 이용하여 선언합니다.
String은 문자’열’ 을 표현하는 타입이며 "" 혹은 """ 로 감싸서 표현합니다.
문자열 템플릿의 경우 ${변수} 형태로 문자열 내에서 사용됩니다.
 
😎 예시 입니다.
val AlpabetA = 'A' val str1 = "String" val str2 = """ abcde """ println("str1 is ${str1}") // str1 is String
 
 
 
모든 타입이 가능한 타입 (Any)
Any는 코틀린에서 최상위 클래스 입니다. 따라서 Any타입으로 선언한 변수에는 모든 타입의 데이터를 할당할 수 있습니다.
 
 
반환(return)이 없는 함수
Unit 타입으로 선언한 변수에는 Unit 객체만 대입할 수 있습니다. 보통 함수에서 반환문이 없음을 명시적으로 나타낼 때 사용됩니다
fun some(): Unit { println(1 + 1) }
  • 함수를 선언할 때 반환 타입을 생략하면 자동으로 Unit이 적용됩니다.
 
 
null이나 예외를 반환하는 함수 (Nothing)
Nothing도 Unit과 마찬가지로 의미 있는 데이터가 아니라 특수한 상황을 표현합니다. Nothing으로 선언한 변수에는 null만 대입할 수 있습니다.
val data: Nothing? = null // 주로 함수의 반환 타입에 사용 fun f1(): Nothing? { return null } fun f2(): Nothing? { throw Exception() }
 
 
 
 
 
 
 

2. 함수


2.1 함수 선언

코틀린에서 함수를 선언할 때는 fun키워드를 이용합니다.
선언 방식은 다음과 같습니다.
fun 함수명(매개변수이름: 타입): 반환타입 { 함수내용 } fun tenten(data:Int): Int { return data * 100 }
 
 
 

2.2 변수 기본 값 선언

매개변수에 값이 없다면 기본 값을 넣어줄 수 있습니다.
fun tenten(data: Int = 10): Int { return data }
 
 
또한 해당 함수를 선언할 때, 매개변수를 지정하여 호출할 수도 있습니다.
fun pls(data1: Int, data2: Int): Int { return data1 + data2 } pls(data2 = 123, data1 = 456)
 
 
 
 
 
 

3. 컬렉션


3.1 Array (배열)

코틀린의 배열은 Array 클래스로 표현합니다. 처음 생성할 때 첫 번째 인자는 배열의 크기, 두번째 인자는 초깃값을 지정하는 함수 입니다.
 
선언
// Int형 크기 3짜리 배열 val arr1: Array<Int> = Array(3, { 0 }) // String형 크기 4짜리 배열 공백으로 선언 val arr2: Array<String> = Array(4, {""} // 제네릭 형식이 아닌 기초 타입의 배열 val arr1: IntArray = IntArray(3, { 0 }) val arr2: BooleanArray = BooleanArray(3, { false }) val arr3: ByteArray = ByteArray(3, { 0 }) // ... CharArray, DoubleArray, FloatArray, LongArray, ShortArray
 
 
데이터 접근
val arr1: Array<Int> = Array(3, { 0 }) // arrayOf를 이용한 선 val arr2: arrayOf<Int> (10, 20, 30) // Index 형식 arr1[0] = 1 arr1[1] = 2 // get set 방식 arr1.set(0) = 1 arr1.set(1) = 2 // 기초 타입을 대상으로 하는 arrayOf val arr1 = intArray(1, 2, 3) val arr2 = booleanArrayOf(true, false) //... charArrayOf, doubleArrayOf, floatArrayOf, longArrayOf, shortArrayOf
 
 
 
 

3.2 List

순서가 있는 데이터의 집합으로 데이터의 중복을 허용합니다.
배열과 List의 차이는 배열(Array)은 길이를 변경할 수 없지만 List는 선언시 MutableList로 선언하면 길이를 변동시킬 수 있습니다.
 
💡
가변 클래스 / 불변 클래스
Collection 타입의 클래스는 가변 클래스와 불변 클래스로 나뉘는데, 불변 클래스는 초기에 데이터를 대입하면 더 이상 변경할 수 없는 타입입니다. 하지만 가변 클래스는 초깃값을 대입한 이후에도 데이터를 추가하거나 변경할 수 있습니다. 보통 변하기 쉬운이라는 뜻인 mutable 을 사용합니다.
 
🔎 List
  • 불변 : listOf()
  • 가변 : mutableListOf()
 
➡️ 예시
// 불변 var list = listOf<Int>(10, 20, 30) // 가변 add() set() 이용 가능 var mutableList = mutableListOf<Int>(10,20,30)
 
 

3.3 Set

순서가 없으며 데이터의 중복을 허용하지 않습니다.
🔎 Set
  • 불변 : setOf()<객체 타입>
  • 가변 : mutableSetOf()<객체 타입>
 
➡️ 예시
// 불변 var s = setOf<Int>(10, 20, 30) // 가변 add() set() 이용 가능 var sList = mutableSetOf<Int>(10,20,30)
 
 
 

3.4 Map

키와 값으로 이루어진 데이터 집합으로, 순서가 없으며 키의 중복은 허용하지 않습니다.
key와 value를 넣을때는 “Pair(’key’, ‘value’)" 처럼 객체로 표현하거나 "key" to "value" 형식을 사용합니다.
  • 두개를 같이 써도 상관 없습니다.
 
🔎 Map
  • 불변 : mapOf()
  • 가변 : mutableMapOf()
 
➡️ 예시
// 불변 var m1 = mapOf<String, String>(Pair("a", "apple")) //pair var m2 = mapOf<String, String>("b" to "banana")) // key to value // 이런식으로 사용 가능 fun main() { var m1 = mapOf<String, String>(Pair("a", "apple")) var m2 = mapOf<String, String>("b" to "banana") println("${m1.get("a")}, ${m2.get("b")}") }
 
 
 
 
 
 
 
 

4. 조건문과 반복문


4.1 조건문

기본
다른 언어의 조건문과 동일합니다.
if (조건1) { 수행 } else if (조건2){ 수행 } else { 수행 }
 
 
표현식을 이용한 사용
val data1 = if (value > 0) { println("양수") true } else { println("음수 혹은 0") false }
  • value가 0 이상이라면 data1에 true가 저장, 아니면 false가 저장됩니다.
 
 
 
조건문 when
when 키워드는 소괄호 안에 넣은 데이터가 조건이 되고, 이 값에 따라 각 구문을 실행합니다
when (data) { "hello" -> println("hello") "world" -> println("world) else -> { println("no helloworld?!?!?") } }
 
 
각 구문을 다양하게 설정해 줄 수 있습니다.
when (data) { is String -> println("흠.. 일단 문자열이군") 20, 30 -> println("20이거나 30이군") in 1..10 -> println("1과 10 사이의 수이군!") else -> println("뭔데 이건") } // 데이터 명시 x when { data <=0 -> println("흠.. 일단 0보다 작군") else -> println("흠.. 일단 0보다 크군") }
  • 상단부터 맞는 부분에서 멈춰 실행합니다.
  • data 부분을 생략하고 조건 식 자체를 선언해 줄 수 있습니다.
 
 
표현식으로도 사용이 가능합니다.
val result when { data <= 0 -> "data is <=0" data > 100 -> "data is > 100" else -> "data is wtf" }
  • else는 반드시 들어가야 합니다.
 
 
 
 

4.2 반복문 for과 while

for문
// 기본 for ( 조건 ) { 반복할 구문 } // 조건 for (i in 1..10) // 1부터 10까지 1씩 증가 for (i in 1 until 10) //1부터 10 전까지 1씩 증가 (10 미포함) for (i in 1..10 step 2) //1부터 10까지 step 2씩 증가 for (i in 10 downTo 1) // 10부터 1까지 1씩 감소 // 컬렉션 조건 for (i in data.indices) // 데이터 개수만큼 for ((index, value) in data.withIndex()) // 인덱스와 값을 가져옴
  • 파이선과 자바를 섞어놓은듯함
 
 
while 문
while (조건) { 반복문 }